package cn.bearspark.idgenerator.provider.dao.mapper;

import cn.bearspark.idgenerator.provider.dao.po.IdGeneratorPO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;

/**
 * id 生成器配置数据的数据映射接口
 *
 * @author f
 */
@Mapper
public interface IdGeneratorMapper {

    /**
     * 获取所有的 id 生成器配置数据
     *
     * @return 所有的 id 生成器配置数据
     */
    @Select("SELECT code, `desc`, start, step, seq, version, create_time, update_time " +
            "FROM t_id_generator_config")
    List<IdGeneratorPO> list();

    /**
     * 获取指定业务码的 id 生成器
     *
     * @param code 指定的业务码
     * @return 对应的 id 生成器
     */
    @Select("SELECT code, start, step, seq, version " +
            "FROM t_id_generator_config " +
            "WHERE code = #{code}")
    IdGeneratorPO selectByCode(@Param("code") Integer code);

    /**
     * 更新指定业务码对应的 id 生成器配置的 id 段
     * <p>
     * 使用乐观锁机制，保证在部署了多台 id 生成器的机器的环境下，不会产生重复抢占同一个 id 段的情况
     * 也就是说，乐观锁保证了分布式 id 的全局唯一性
     *
     * @param code    指定的业务码
     * @param version 乐观锁的版本
     * @return 更新操作影响的行数
     */
    @Update("UPDATE t_id_generator_config " +
            "SET start   = start + step, " +
            "    version = version + 1 " +
            "WHERE code = #{code} and version = #{version}")
    int updateWithOptimisticLock(@Param("code") Integer code, @Param("version") Integer version);
}
